package com.jw.qme.utils;

/**
 * ClassName: com.jw.qme.utils
 * Datetime: 2025/5/1 下午6:42
 * Description:
 *
 * @author 汪佳泉
 * @version 1.0
 * @since 1.0
 */
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;

public class MessageProtocol {

    // 协议头长度：length(4) + type(1)
    public static final int HEADER_LENGTH = 5;

    /**
     * 将 JSON 消息封装为带协议头的 ByteBuffer
     */
    public static ByteBuffer encode(byte type, byte[] content) {
        ByteBuffer buffer = java.nio.ByteBuffer.allocate(HEADER_LENGTH + content.length);
        buffer.putInt(content.length); // 写入消息体长度
        buffer.put(type);              // 写入消息类型
        buffer.put(content);           // 写入消息体
        buffer.flip();                 // 切换为读模式
        return buffer;
    }

    /**
     * 从缓冲区中解析完整消息（支持粘包/拆包）
     */
    public static DecodedMessage decode(ByteBuffer buffer) {
        if (buffer.remaining() < HEADER_LENGTH) {
            return null; // 数据不足，等待下次读取
        }
        buffer.mark(); // 标记当前位置
        int length = buffer.getInt();
        byte type = buffer.get();
        if (buffer.remaining() < length) {
            buffer.reset(); // 回退到标记位置
            return null;    // 数据不完整，等待后续数据
        }
        byte[] content = new byte[length];
        buffer.get(content);
        return new DecodedMessage(type, content);
    }

    /**
     * 解码后的消息对象
     */
    public static class DecodedMessage {
        private final byte type;
        private final byte[] content;
        public DecodedMessage(byte type, byte[] content) {
            this.type = type;
            this.content = content;
        }
        public byte getType() {
            return type;
        }
        public byte[] getContent() {
            return content;
        }
    }
}
